#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}


void Dialog::on_pushButton_clicked()
{
    GetHostNameAndIpAddress();
}

void Dialog::on_pushButton_2_clicked()
{
      QString temp="";
      //返回主机所找到的所有网络接口列表
     QList<QNetworkInterface> netlist=QNetworkInterface::allInterfaces();//表示网络接口，获取网络接口详细信息，枚举所有可用的网络接口
     for(int i=0;i<netlist.size();i++)
     {
        QNetworkInterface tempnet=netlist.at(i);//获取单独的网络接口
        temp=temp+"设备名称："+tempnet.name()+"\n";
        temp=temp+"硬件地址："+tempnet.hardwareAddress()+"\n";
        //遍历ip对应的信息
        QList<QNetworkAddressEntry> entrylist=tempnet.addressEntries();//表示网络接口上的一个IP地址
        for(int i=0;i<entrylist.size();i++)
        {
            QNetworkAddressEntry tempentry=entrylist.at(i);
            temp=temp+"IP地址："+tempentry.ip().toString()+"\n";
            temp=temp+"子网掩码："+tempentry.netmask().toString()+"\n";
            temp=temp+"广播地址："+tempentry.broadcast().toString()+"\n";
        }

     }
     QMessageBox::information(this,"数据",temp);
}

void Dialog::GetHostNameAndIpAddress()
{
    QString hostName=QHostInfo::localHostName();//返回本地主机名称
    ui->lineEdit->setText(hostName);
    QString localIpAdress="";
    QHostInfo hostinfo=QHostInfo::fromName(hostName);//通过主机名找主机信息，返回值为主机名对应的地址信息
    //错误：QHostInfo没有静态方法addresses()
    QList<QHostAddress> list=hostinfo.addresses();//QHostInfo::fromName() 是一个静态方法，它根据主机名查询主机信息，返回一个 QHostInfo 对象。QHostInfo::addresses() 是一个实例方法，它返回与 QHostInfo 对象关联的 IP 地址列表。
    for(int i=0;i<list.size();i++)//明确筛选IPv4地址，避免获取到IPv6的地址
    {
        QHostAddress addresshost=list.at(i);
        if(QAbstractSocket::IPv4Protocol==addresshost.protocol())
        {
            localIpAdress=addresshost.toString();
            break;
        }
    }
    //如果没有找到IPv4的地址，使用第一个可用地址
    if(localIpAdress.isEmpty()&&!list.isEmpty())
    {
        localIpAdress=list.first().toString();
    }
    if(localIpAdress.isEmpty())
    {
        localIpAdress="未知";
    }

    ui->lineEdit_2->setText(localIpAdress);
}
